function getSequence(arr){
    const p = arr.slice();//p[i]存的是根据result得出的递增序列指向i的上一个索引
    const result = [0]; // result[i] 表示当递增序列长度为i时，i位置最小的值所在的索引
    let i,j,u,v,c;
    const len = arr.length;
    for (i = 0;i<len;i++){
        const arrI = arr[i];
        if (arrI !== 0 ){
            j = result[result.length - 1];
            if (arr[j] < arrI){
                p[i] = j;
                result.push(i);
                continue;
            }
            u = 0
            v = result.length - 1;
            // 二分查找
            while (u<v){
                c = (u+v) >>1;
                if (arr[result[c]] < arrI){
                    u = c + 1;

                } else {
                    v = c;
                }
            }
            if (arrI < arr[result[u]]){
                if (u>0) {
                    p[i] = result[u-1];
                }
                result[u] = i;
            }
        }
        
    }
    u = result.length;
    v = result[u-1];
    //通过p将result串联起来，先找到最后一个位置的索引，然后通过p[i]依次获得前面所有位置的索引
    while (u-- > 0) {
        result[u] = v;
        v = p [v];
    }
    return result;
}




const r = getSequence([10,11,1,13,7,8,9]);
// const r = getSequence([4,2,3,1,7,11,19,21,9]);
console.log(r);